

.global reset_vector
.global _exception_vectors

.section ".arm_vector", "ax"


_exception_vectors:

    .word	0x20041000				    // init sp, msp
    .word   Reset_Handler	            // Reset Handler
    .word   NMI_Handler                 // NMI Handler
    .word   HardFault_Handler           // Hard Fault Handler
    .word   0           				// Reserved
    .word   0            				// Reserved
    .word   0          					// Reserved
    .word   0                           // Reserved
    .word   0                           // Reserved
    .word   0                           // Reserved
    .word  	0                           // Reserved
    .word   SVC_Handler                 // SVCall Handler
    .word   0            				// Debug Monitor Handler
    .word   0                           // Reserved
    .word   PendSV_Handler            	// PendSV Handler
    .word   SysTick_Handler           	// SysTick Handler

	/* rp2040 soc, vector table. */
	
    .word   Default_Handler				//  0
    .word   0                		    //  1
    .word   0                           //  2
    .word   0                           //  3
    
    .word   0                           //  4
    .word   USBctrl_Handler             //  5, USBCTRL_IRQ_IRQn
    .word   0                           //  6
    .word   Default_Handler             //  7, PIO0_IRQ_0_IRQn

    .word   0                           //  8
    .word   0                           //  9
    .word   0               		    // 10
    .word   0                           // 11

    .word   0                           // 12
    .word   0                           // 13
    .word   0                           // 14
    .word   Default_Handler             // 15, SIO_IRQ_PROC0_IRQn

    .word   0                           // 16, SIO_IRQ_PROC1_IRQn
    .word   0                           // 17
    .word   0                           // 18
    .word   0                           // 19

    .word   Default_Handler             // 20, UART0_IRQ_IRQn
    .word   Default_Handler             // 21, UART1_IRQ_IRQn
    .word   0                           // 22
    .word   0                           // 23

    .word   0                           // 24
    .word   0                           // 25
    .word   0                           // 26
    .word   0                           // 27

    .word   0                           // 28
    .word   0                           // 29
    .word   0                           // 30
    .word   0                           // 31

    .word   0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0


_exception_vectors_cop:

    .word	0x20042000				    // init sp, msp
    .word   Reset_Handler	            // Reset Handler
    .word   NMI_Handler                 // NMI Handler
    .word   HardFault_Handler           // Hard Fault Handler
    .word   0           				// Reserved
    .word   0            				// Reserved
    .word   0          					// Reserved
    .word   0                           // Reserved
    .word   0                           // Reserved
    .word   0                           // Reserved
    .word  	0                           // Reserved
    .word   Default_Handler             // SVCall Handler
    .word   0            				// Debug Monitor Handler
    .word   0                           // Reserved
    .word   Default_Handler            	// PendSV Handler
    .word   SysTick_P1_Handler         	// SysTick Handler

	/* rp2040 soc, vector table. */
	
    .word   Default_Handler				//  0
    .word   Default_Handler    		    //  1
    .word   0                           //  2
    .word   0                           //  3
    .word   0                           //  4
    .word   0             				//  5
    .word   0                           //  6
    .word   0 				            //  7, PIO0_IRQ_0_IRQn

    .word   0                           //  8
    .word   0                           //  9
    .word   0               		    // 10
    .word   0                           // 11
    .word   0                           // 12
    .word   0                           // 13
    .word   0                           // 14
    .word   0                           // 15, SIO_IRQ_PROC0_IRQn

    .word   0                           // 16, SIO_IRQ_PROC1_IRQn
    .word   0                           // 17
    .word   0                           // 18
    .word   0                           // 19
    .word   0             				// 20, UART0_IRQ_IRQn
    .word   0             				// 21, UART1_IRQ_IRQn
    .word   0                           // 22
    .word   Default_Handler             // 23, I2C0_IRQ_IRQn

    .word   0                           // 24, I2C1_IRQ_IRQn
    .word   0                           // 25
    .word   0                           // 26
    .word   0                           // 27
    .word   0                           // 28
    .word   0                           // 29
    .word   0                           // 30
    .word   0                           // 31


// void __aeabi_memclr ( void *dest, size_t n );
// void __aeabi_memcpy ( void *dest, const void *src, size_t n );

.section ".text", "ax"


.type Reset_Handler,%function
.type NMI_Handler,%function

NMI_Handler:
Reset_Handler:
    
    ldr     r1, =0xE000ED00
    ldr     r2, =_exception_vectors
    str     r2, [r1, #8]
    
    ldr     r0, =__bss_start
	ldr     r1, =__bss_size
	bl      __aeabi_memclr

    ldr     r0, =SystemInit
    blx     r0
    
    ldr     r0, =main
    blx     r0

1:	nop
	nop
	b		1b
	

.type HardFault_Handler, %function
HardFault_Handler:
	LDR		R4, =HardFault_exception
	BX      R4


.type DebugMon_Handler, %function
DebugMon_Handler:
	b		.
	nop


.type PendSV_Handler, %function
PendSV_Handler:
	b		.
	nop

.type Default_Handler, %function
Default_Handler:
	b		.
	nop
	

// [sp+ 0] = r0,  [sp+ 4] = r1,  [sp+ 8] = r2,  [sp+12] = r3, 
// [sp+16] = r12, [sp+20] = lr,  [sp+24] = pc,  [sp+20] = xPSR

.type SVC_Handler, %function
SVC_Handler:

	PUSH	{ R4, LR }

	MOV		R1, R0

	ADD		R2, SP, #8
	LDR     R3, [R2, #24 ]
	SUBS    R3, R3, #2
    LDRB    R0, [R3]

	LDR		R4, =SVC_umsg_handler
	BLX		R4

	//
	ADD		R1, SP, #8
	STR     R0, [R1]
	POP 	{ R4, PC }




